17. 解决方案: LEFT 和 RIGHT JOIN
# LEFT JOIN 和 RIGHT JOIN 解决方案
这一部分讲解的是上一部分的最后两个问题,首先再看看我们处理的这两个表格:

INNER JOIN 问题
这些问题旨在让你对 LEFT JOIN 和 INNER JOIN 的原理有所了解,然后才能使用它们处理更复杂的问题。
对于如下所示的 INNER JOIN :
SELECT c.countryid, c.countryName, s.stateName
FROM Country c
JOIN State s
ON c.countryid = s.countryid;
我们实际上是将两个表格中匹配的主键和外键行连接到一起,如下图所示。

生成的表格将如下所示:
countryid | countryName | stateName |
---|---|---|
1 | India | Maharashtra |
1 | India | Punjab |
2 | Nepal | Kathmandu |
3 | United States | California |
3 | United States | Texas |
4 | Canada | Alberta |
LEFT JOIN 问题
这些问题旨在让你对 LEFT JOIN 和 INNER JOIN 的原理有所了解,然后才能使用它们处理更复杂的问题。
对于如下所示的 LEFT JOIN :
SELECT c.countryid, c.countryName, s.stateName
FROM Country c
LEFT JOIN State s
ON c.countryid = s.countryid;
和之前一样,我们实际上是将两个表格中匹配的主键和外键行连接到一起,但是我们还从 Country 表格中获取额外的行,即使它们在 State 表格中没有匹配的项。因此,我们获取的是 INNER JOIN 生成的所有行,同时还获取 FROM 中的表格里的其他行。

生成的表格将如下所示:
countryid | countryName | stateName |
---|---|---|
1 | India | Maharashtra |
1 | India | Punjab |
2 | Nepal | Kathmandu |
3 | United States | California |
3 | United States | Texas |
4 | Canada | Alberta |
5 | Sri Lanka | NULL |
6 | Brazil | NULL |
最后的 LEFT JOIN 注意事项
如果我们翻转表格顺序的话,实际上和 JOIN 语句获得的结果完全一样:
SELECT c.countryid, c.countryName, s.stateName
FROM State s
LEFT JOIN Country c
ON c.countryid = s.countryid;
这是因为如果 State 位于 左侧 表格中,则所有行再次出现在 右侧 表格中。

生成的表格将如下所示:
countryid | countryName | stateName |
---|---|---|
1 | India | Maharashtra |
1 | India | Punjab |
2 | Nepal | Kathmandu |
3 | United States | California |
3 | United States | Texas |
4 | Canada | Alberta |